๋ณต์กํ React ์ ํ๋ฆฌ์ผ์ด์ ์์ CSS ์ฝ์ ์์๋ฅผ ์ ๋ฐํ๊ฒ ์ ์ดํ๊ณ ์ฑ๋ฅ์ ์ต์ ํํ๋ฉฐ ์คํ์ผ๋ง ์ถฉ๋์ ํด๊ฒฐํ๋ React์ experimental_useInsertionEffect ํ ์ ํ์ํฉ๋๋ค.
React์ experimental_useInsertionEffect: ์ฝ์ ์์ ์ ์ด ๋ง์คํฐํ๊ธฐ
์ฌ์ฉ์ ์ธํฐํ์ด์ค ๊ตฌ์ถ์ ์ํ ์ ๋์ ์ธ JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ React๋ ์ง์์ ์ผ๋ก ๋ฐ์ ํ๊ณ ์์ต๋๋ค. ์ต๊ทผ ์คํ์ ์ผ๋ก ์ถ๊ฐ๋ ๊ธฐ๋ฅ ์ค ํ๋๋ experimental_useInsertionEffect ํ
์
๋๋ค. ์ด ๊ฐ๋ ฅํ ๋๊ตฌ๋ ๊ฐ๋ฐ์์๊ฒ CSS ๊ท์น์ด DOM์ ์ฝ์
๋๋ ์์๋ฅผ ์ธ๋ฐํ๊ฒ ์ ์ดํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์์ง ์คํ ๋จ๊ณ์ด์ง๋ง, experimental_useInsertionEffect๋ฅผ ์ดํดํ๊ณ ํ์ฉํ๋ฉด ๋ณต์กํ React ์ ํ๋ฆฌ์ผ์ด์
, ํนํ CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ณต์กํ ์คํ์ผ๋ง ์๊ตฌ์ฌํญ์ ๋ค๋ฃจ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฑ๋ฅ๊ณผ ์ ์ง๋ณด์์ฑ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
์ฝ์ ์์ ์ ์ด์ ํ์์ฑ ์ดํดํ๊ธฐ
์น ๊ฐ๋ฐ ์ธ๊ณ์์๋ CSS ๊ท์น์ด ์ ์ฉ๋๋ ์์๊ฐ ์ค์ํฉ๋๋ค. CSS ๊ท์น์ ์บ์ค์ผ์ด๋ฉ ๋ฐฉ์์ผ๋ก ์ ์ฉ๋๋ฉฐ, ๋์ค์ ์ค๋ ๊ท์น์ด ์ด์ ๊ท์น์ ๋ฎ์ด์ธ ์ ์์ต๋๋ค. ์ด๋ฌํ ์บ์ค์ผ์ด๋ฉ ๋์์ CSS ๋ช
์๋์ ์คํ์ผ์ด ํ์ด์ง์ ์ต์ข
์ ์ผ๋ก ๋ ๋๋ง๋๋ ๋ฐฉ์์ ๊ธฐ๋ณธ์
๋๋ค. React๋ฅผ ์ฌ์ฉํ ๋, ํนํ Styled Components, Emotion ๋๋ Material UI์ ๊ฐ์ CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจ๊ป ์ฌ์ฉํ ๋, ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ฌธ์์ <head>์ ์คํ์ผ์ ์ฝ์
ํ๋ ์์๊ฐ ๋งค์ฐ ์ค์ํด์ง๋๋ค. ๋ค๋ฅธ ์์ค์ ์คํ์ผ์ด ์๋ํ์ง ์์ ์์๋ก ์ฝ์
๋ ๋ ์๊ธฐ์น ์์ ์คํ์ผ๋ง ์ถฉ๋์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ ์์์น ๋ชปํ ์๊ฐ์ ๊ฒฐํจ, ๊นจ์ง ๋ ์ด์์, ๊ทธ๋ฆฌ๊ณ ๊ฐ๋ฐ์์ ์ต์ข
์ฌ์ฉ์ ๋ชจ๋์๊ฒ ์ข์ ๊ฐ์ ์๊ฒจ์ค ์ ์์ต๋๋ค.
๊ธฐ๋ณธ ์คํ์ผ์ ์ฃผ์ ํ๋ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ , ๊ทธ ์คํ์ผ ์ค ์ผ๋ถ๋ฅผ ์์ ๋ง์ ์ปค์คํ CSS๋ก ๋ฎ์ด์ฐ๋ ค๋ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด๋ณด์ญ์์ค. ๋ง์ฝ ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์คํ์ผ์ด ๋น์ ์ ์ปค์คํ ์คํ์ผ *๋ค์* ์ฝ์ ๋๋ค๋ฉด, ๋น์ ์ ๋ฎ์ด์ฐ๊ธฐ๋ ํจ๊ณผ๊ฐ ์์ ๊ฒ์ ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก, ์ฌ๋ฌ CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํจ๊ป ์ฌ์ฉํ ๋ ์ฝ์ ์์๊ฐ ์ ์คํ๊ฒ ๊ด๋ฆฌ๋์ง ์์ผ๋ฉด ์ถฉ๋์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์๋ ์ ์ญ ์คํ์ผ์ด ํน์ ์ปดํฌ๋ํธ ๋ด์์ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ํด ์ ์ฉ๋ ์คํ์ผ์ ์๋์น ์๊ฒ ๋ฎ์ด์ธ ์ ์์ต๋๋ค.
์ด ์ฝ์
์์๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ ์ ํต์ ์ผ๋ก DOM์ ์ง์ ์กฐ์ํ๊ฑฐ๋ ํน์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ค์ ์ค์ ์ ์์กดํ๋ ๋ฑ ๋ณต์กํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ํฌํจํ์ต๋๋ค. ์ด๋ฌํ ๋ฐฉ๋ฒ๋ค์ ์ข
์ข
๋ถ์์ ํ๊ณ ์ ์ง๋ณด์๊ฐ ์ด๋ ค์ฐ๋ฉฐ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์ ๋ฐํ ์ ์์์ต๋๋ค. experimental_useInsertionEffect๋ ์ด๋ฌํ ๋ฌธ์ ์ ๋ํด ๋ ์ฐ์ํ๊ณ ์ ์ธ์ ์ธ ํด๊ฒฐ์ฑ
์ ์ ๊ณตํฉ๋๋ค.
experimental_useInsertionEffect ์๊ฐ
experimental_useInsertionEffect๋ DOM์ด ๋ณ๊ฒฝ๋๊ธฐ ์ ์ ๋ถ์ ํจ๊ณผ๋ฅผ ์ํํ ์ ์๊ฒ ํด์ฃผ๋ React ํ
์
๋๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ ํ๋ฉด์ ๊ทธ๋ฆฐ ํ์ ์คํ๋๋ useEffect๋ useLayoutEffect์๋ ๋ฌ๋ฆฌ, experimental_useInsertionEffect๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์๊ฐ์ ํํ์ ์
๋ฐ์ดํธํ ๊ธฐํ๋ฅผ ๊ฐ๊ธฐ *์ *์ ์คํ๋ฉ๋๋ค. ์ด ํ์ด๋ฐ์ CSS ์ฝ์
์์๋ฅผ ์ ์ดํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์๋ํ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ๋ ์ด์์์ ๊ณ์ฐํ๊ณ ํ์ด์ง๋ฅผ ๋ ๋๋งํ๊ธฐ ์ ์ DOM์ CSS ๊ท์น์ ์ฝ์
ํ ์ ์๊ฒ ํด์ฃผ๊ธฐ ๋๋ฌธ์
๋๋ค. ์ด๋ฌํ ์ ์ ์ ์ฝ์
์ ์ฌ๋ฐ๋ฅธ ์บ์ค์ผ์ด๋๋ฅผ ๋ณด์ฅํ๊ณ ์ ์ฌ์ ์ธ ์คํ์ผ๋ง ์ถฉ๋์ ํด๊ฒฐํฉ๋๋ค.
์ฃผ์ ํน์ง:
- ๋ ์ด์์ ํจ๊ณผ๋ณด๋ค ๋จผ์ ์คํ:
experimental_useInsertionEffect๋ ๋ชจ๋useLayoutEffectํ ๋ณด๋ค ๋จผ์ ์คํ๋์ด, ๋ ์ด์์ ๊ณ์ฐ ์ ์ DOM์ ์กฐ์ํ ์ ์๋ ์ค์ํ ์๊ฐ์ ์ ๊ณตํฉ๋๋ค. - ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง ํธํ: ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง(SSR)๊ณผ ํธํ๋๋๋ก ์ค๊ณ๋์ด ๋ค๋ฅธ ํ๊ฒฝ์์๋ ์ผ๊ด๋ ๋์์ ๋ณด์ฅํฉ๋๋ค.
- CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ํด ์ค๊ณ๋จ: CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์คํ์ผ ์ฝ์ ์์๋ฅผ ๊ด๋ฆฌํ ๋ ์ง๋ฉดํ๋ ๋ฌธ์ ๋ค์ ํด๊ฒฐํ๊ธฐ ์ํด ํน๋ณํ ๋ง์ถคํ๋์์ต๋๋ค.
- ์คํ์ ์ํ: ์ด ํ ์ ์์ง ์คํ์ ์ด๋ผ๋ ์ ์ ๊ธฐ์ตํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด๋ ํฅํ React ๋ฒ์ ์์ API๊ฐ ๋ณ๊ฒฝ๋ ์ ์์์ ์๋ฏธํฉ๋๋ค. ํ๋ก๋์ ํ๊ฒฝ์์๋ ์ ์คํ๊ฒ ์ฌ์ฉํ๊ณ ํ ์ด ๋ฐ์ ํจ์ ๋ฐ๋ผ ์ฝ๋๋ฅผ ์์ ํ ์ค๋น๋ฅผ ํด์ผ ํฉ๋๋ค.
experimental_useInsertionEffect ์ฌ์ฉ ๋ฐฉ๋ฒ
๊ธฐ๋ณธ์ ์ธ ์ฌ์ฉ ํจํด์ experimental_useInsertionEffect ์ฝ๋ฐฑ ๋ด์์ DOM์ CSS ๊ท์น์ ์ฃผ์
ํ๋ ๊ฒ์
๋๋ค. ์ด ์ฝ๋ฐฑ์ ์ธ์๋ฅผ ๋ฐ์ง ์์ผ๋ฉฐ, useEffect์ ์ ์ฌํ๊ฒ ์ ๋ฆฌ(cleanup) ํจ์๋ฅผ ๋ฐํํด์ผ ํฉ๋๋ค. ์ ๋ฆฌ ํจ์๋ ์ปดํฌ๋ํธ๊ฐ ์ธ๋ง์ดํธ๋๊ฑฐ๋ ํ
์ ์์กด์ฑ์ด ๋ณ๊ฒฝ๋ ๋ ์คํ๋ฉ๋๋ค.
์์ :
```javascript import { experimental_useInsertionEffect } from 'react'; function MyComponent() { experimental_useInsertionEffect(() => { // style ์์ ์์ฑ const style = document.createElement('style'); style.textContent = ` .my-component { color: blue; font-weight: bold; } `; // head์ style ์์ ์ถ๊ฐ document.head.appendChild(style); // ์ ๋ฆฌ ํจ์ (์ปดํฌ๋ํธ๊ฐ ์ธ๋ง์ดํธ๋ ๋ style ์์ ์ ๊ฑฐ) return () => { document.head.removeChild(style); }; }, []); // ๋น ์์กด์ฑ ๋ฐฐ์ด์ ์ด ํจ๊ณผ๊ฐ ๋ง์ดํธ๋ ๋ ํ ๋ฒ๋ง ์คํ๋จ์ ์๋ฏธ return์ค๋ช :
- React ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์
experimental_useInsertionEffect๋ฅผ ๊ฐ์ ธ์ต๋๋ค. MyComponent์ปดํฌ๋ํธ ๋ด๋ถ์์experimental_useInsertionEffect๋ฅผ ํธ์ถํฉ๋๋ค.- ํจ๊ณผ ์ฝ๋ฐฑ ๋ด์์
<style>์์๋ฅผ ๋ง๋ค๊ณtextContent๋ฅผ ์ฃผ์ ํ๋ ค๋ CSS ๊ท์น์ผ๋ก ์ค์ ํฉ๋๋ค. - ๋ฌธ์์
<head>์<style>์์๋ฅผ ์ถ๊ฐํฉ๋๋ค. - ์ปดํฌ๋ํธ๊ฐ ์ธ๋ง์ดํธ๋ ๋
<head>์์<style>์์๋ฅผ ์ ๊ฑฐํ๋ ์ ๋ฆฌ ํจ์๋ฅผ ๋ฐํํฉ๋๋ค. - ๋น ์์กด์ฑ ๋ฐฐ์ด
[]๋ ์ด ํจ๊ณผ๊ฐ ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋ ๋ ํ ๋ฒ๋ง ์คํ๋๊ณ ์ธ๋ง์ดํธ๋ ๋ ์ ๋ฆฌ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
์ค์ฉ์ ์ธ ์ฌ์ฉ ์ฌ๋ก ๋ฐ ์์
1. CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์คํ์ผ ์ฃผ์ ์์ ์ ์ดํ๊ธฐ
์ฃผ์ ์ฌ์ฉ ์ฌ๋ก ์ค ํ๋๋ CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋ ์ฃผ์
์์๋ฅผ ์ ์ดํ๋ ๊ฒ์
๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ธฐ๋ณธ ๋์์ ์์กดํ๋ ๋์ , experimental_useInsertionEffect๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์์ ํน์ ์ง์ ์ ์คํ์ผ์ ๋ช
์์ ์ผ๋ก ์ฝ์
ํ ์ ์์ต๋๋ค.
Styled Components ์์ :
styled-components๋ฅผ ์ฌ์ฉํ ์ ์ญ ์คํ์ผ์ด ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ธฐ๋ณธ ์คํ์ผ์ ๋ฎ์ด์ฐ๊ณ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. experimental_useInsertionEffect๊ฐ ์๋ค๋ฉด, ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์คํ์ผ์ ๋์ค์ ์ฃผ์
ํ ๊ฒฝ์ฐ ๋น์ ์ ์ ์ญ ์คํ์ผ์ด ๋ฎ์ด์ฐ์ผ ์ ์์ต๋๋ค.
์ด ์์ ์์๋ ์ ์ญ ์คํ์ผ์ <head>์ ๋ค๋ฅธ ์คํ์ผ๋ค *์์* ๋ช
์์ ์ผ๋ก ์ฝ์
ํ์ฌ ์ฐ์ ์์๋ฅผ ๊ฐ๋๋ก ๋ณด์ฅํฉ๋๋ค. insertBefore ํจ์๋ ์คํ์ผ์ ์ฒซ ๋ฒ์งธ ์์ ๋
ธ๋ ์์ ์ฝ์
ํ ์ ์๊ฒ ํด์ค๋๋ค. ์ด ํด๊ฒฐ์ฑ
์ ์ ์ญ ์คํ์ผ์ด ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ํด ์ ์๋ ์ถฉ๋ํ๋ ์คํ์ผ์ ์ผ๊ด๋๊ฒ ๋ฎ์ด์ฐ๋๋ก ๋ณด์ฅํฉ๋๋ค. ๋ฐ์ดํฐ ์์ฑ์ ์ฌ์ฉํ๋ฉด ์ฃผ์
๋ ์ฌ๋ฐ๋ฅธ ์คํ์ผ์ ํ์คํ ์ ๊ฑฐํ ์ ์์ต๋๋ค. ๋ํ `experimental_useInsertionEffect`๊ฐ ๊ทธ ์ญํ ์ ๋์ ํ๋ฏ๋ก `GlobalStyle` ์ปดํฌ๋ํธ๋ฅผ ์ ๊ฑฐํ๊ณ ์์ต๋๋ค.
2. ๋ช ์๋๋ฅผ ์ด์ฉํ ํ ๋ง ๋ฎ์ด์ฐ๊ธฐ ์ ์ฉ
ํ
๋ง ๊ธฐ๋ฅ์ ๊ฐ์ถ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ ๋, ์ฌ์ฉ์๊ฐ ํน์ ์ปดํฌ๋ํธ์ ๋ชจ์๊ณผ ๋๋์ ์ปค์คํฐ๋ง์ด์ฆํ ์ ์๋๋ก ํ๊ณ ์ถ์ ์ ์์ต๋๋ค. experimental_useInsertionEffect๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋์ ๋ช
์๋๋ฅผ ๊ฐ์ง ํ
๋ง๋ณ ์คํ์ผ์ ์ฝ์
ํจ์ผ๋ก์จ ์ฌ์ฉ์ ์ ํธ๋๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ฉ๋๋๋ก ํ ์ ์์ต๋๋ค.
์์ :
```javascript import { useState, experimental_useInsertionEffect } from 'react'; function ThemeSwitcher() { const [theme, setTheme] = useState('light'); const toggleTheme = () => { setTheme(theme === 'light' ? 'dark' : 'light'); }; experimental_useInsertionEffect(() => { const style = document.createElement('style'); style.id = 'theme-override'; style.textContent = ` body { background-color: ${theme === 'dark' ? '#333' : '#fff'}; color: ${theme === 'dark' ? '#fff' : '#000'}; } `; document.head.appendChild(style); return () => { const themeStyle = document.getElementById('theme-override'); if (themeStyle) { document.head.removeChild(themeStyle); } }; }, [theme]); return (This is some content.
์ด ์์ ์์๋ theme ์ํ์ ๋ฐ๋ผ ํ
๋ง๋ณ ์คํ์ผ์ ๋์ ์ผ๋ก ์์ฑํฉ๋๋ค. experimental_useInsertionEffect๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ, ํ
๋ง๊ฐ ๋ณ๊ฒฝ๋ ๋ ์ด๋ฌํ ์คํ์ผ์ด ์ฆ์ ์ ์ฉ๋์ด ์ํํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋๋ก ๋ณด์ฅํฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ํผํ๊ธฐ ์ํด ์ ๋ฆฌ ๊ณผ์ ์์ ์คํ์ผ ์์๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ฝ๋๋ก id ์ ํ์๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ด ํ
์ 'theme' ์ํ์ ์์กดํ๊ธฐ ๋๋ฌธ์, ํ
๋ง๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ํจ๊ณผ์ ์ ๋ฆฌ๊ฐ ์คํ๋ฉ๋๋ค.
3. ์ธ์ ๋งค์ฒด๋ฅผ ์ํ ์คํ์ผ ์ฃผ์
๋๋ก๋ ํ์ด์ง๊ฐ ์ธ์๋ ๋๋ง ํน์ ์คํ์ผ์ ์ ์ฉํด์ผ ํ ํ์๊ฐ ์์ต๋๋ค. experimental_useInsertionEffect๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ์ธ์ ์ ์ฉ ์คํ์ผ์ ๋ฌธ์์ <head>์ ์ฃผ์
ํ ์ ์์ต๋๋ค.
์์ :
```javascript import { experimental_useInsertionEffect } from 'react'; function PrintStyles() { experimental_useInsertionEffect(() => { const style = document.createElement('style'); style.media = 'print'; style.textContent = ` body { font-size: 12pt; } .no-print { display: none; } `; document.head.appendChild(style); return () => { document.head.removeChild(style); }; }, []); return (This content will be printed.
์ด ์์ ์์๋ <style> ์์์ media ์์ฑ์ 'print'๋ก ์ค์ ํ์ฌ, ์ด๋ฌํ ์คํ์ผ์ด ํ์ด์ง๊ฐ ์ธ์๋ ๋๋ง ์ ์ฉ๋๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด๋ฅผ ํตํด ํ๋ฉด ํ์์ ์ํฅ์ ์ฃผ์ง ์์ผ๋ฉด์ ์ธ์ ๋ ์ด์์์ ์ฌ์ฉ์ ์ ์ํ ์ ์์ต๋๋ค.
์ฑ๋ฅ ๊ณ ๋ ค์ฌํญ
experimental_useInsertionEffect๊ฐ ์คํ์ผ ์ฝ์
์ ๋ํ ์ธ๋ฐํ ์ ์ด๋ฅผ ์ ๊ณตํ์ง๋ง, ์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ์ ์ผ๋์ ๋๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. DOM์ ์ง์ ์คํ์ผ์ ์ฝ์
ํ๋ ๊ฒ์ ํนํ ์์ฃผ ์ํ๋ ๊ฒฝ์ฐ ์๋์ ์ผ๋ก ๋น์ฉ์ด ๋ง์ด ๋๋ ์์
์ผ ์ ์์ต๋๋ค. ๋ค์์ experimental_useInsertionEffect ์ฌ์ฉ ์ ์ฑ๋ฅ์ ์ต์ ํํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ํ์
๋๋ค.
- ์คํ์ผ ์ ๋ฐ์ดํธ ์ต์ํ: ํ ์ ์์กด์ฑ์ ์ ์คํ๊ฒ ๊ด๋ฆฌํ์ฌ ๋ถํ์ํ ์คํ์ผ ์ ๋ฐ์ดํธ๋ฅผ ํผํ์ญ์์ค. ์ ๋ง ํ์ํ ๋๋ง ์คํ์ผ์ ์ ๋ฐ์ดํธํ์ญ์์ค.
- ์ ๋ฐ์ดํธ ์ผ๊ด ์ฒ๋ฆฌ: ์ฌ๋ฌ ์คํ์ผ์ ์ ๋ฐ์ดํธํด์ผ ํ๋ ๊ฒฝ์ฐ, DOM ์กฐ์ ํ์๋ฅผ ์ค์ด๊ธฐ ์ํด ๋จ์ผ ์ ๋ฐ์ดํธ๋ก ์ผ๊ด ์ฒ๋ฆฌํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
- ์ ๋ฐ์ดํธ ๋๋ฐ์ด์ค ๋๋ ์ค๋กํ: ์ฌ์ฉ์ ์ ๋ ฅ์ ์ํด ์ ๋ฐ์ดํธ๊ฐ ํธ๋ฆฌ๊ฑฐ๋๋ ๊ฒฝ์ฐ, ๊ณผ๋ํ DOM ์กฐ์์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ ๋ฐ์ดํธ๋ฅผ ๋๋ฐ์ด์คํ๊ฑฐ๋ ์ค๋กํํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
- ์คํ์ผ ์บ์ฑ: ๊ฐ๋ฅํ๋ค๋ฉด, ์์ฃผ ์ฌ์ฉ๋๋ ์คํ์ผ์ ์บ์ฑํ์ฌ ๋งค ์ ๋ฐ์ดํธ๋ง๋ค ๋ค์ ์์ฑํ๋ ๊ฒ์ ํผํ์ญ์์ค.
experimental_useInsertionEffect์ ๋์
experimental_useInsertionEffect๊ฐ CSS ์ฝ์
์์๋ฅผ ์ ์ดํ๋ ๊ฐ๋ ฅํ ํด๊ฒฐ์ฑ
์ ์ ๊ณตํ์ง๋ง, ํน์ ์๊ตฌ์ฌํญ๊ณผ ์ ์ฝ ์กฐ๊ฑด์ ๋ฐ๋ผ ๊ณ ๋ คํ ์ ์๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์๋ ์์ต๋๋ค.
- CSS ๋ชจ๋: CSS ๋ชจ๋์ CSS ๊ท์น์ ๋ฒ์๋ฅผ ๊ฐ๋ณ ์ปดํฌ๋ํธ๋ก ํ์ ํ์ฌ ์ด๋ฆ ์ถฉ๋์ ๋ฐฉ์งํ๊ณ ๋ช ์์ ์ธ ์ฝ์ ์์ ์ ์ด์ ํ์์ฑ์ ์ค์ด๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
- CSS ๋ณ์ (์ฌ์ฉ์ ์ ์ ์์ฑ): CSS ๋ณ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๊ฒ ์ ๋ฐ์ดํธํ๊ณ ์ฌ์ฉ์ ์ ์ํ ์ ์๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฐ์ ์ ์ํ ์ ์์ด ๋ณต์กํ ์คํ์ผ ๋ฎ์ด์ฐ๊ธฐ์ ํ์์ฑ์ ์ค์ผ ์ ์์ต๋๋ค.
- CSS ์ ์ฒ๋ฆฌ๊ธฐ (Sass, Less): CSS ์ ์ฒ๋ฆฌ๊ธฐ๋ ๋ณ์, ๋ฏน์ค์ธ, ์ค์ฒฉ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ CSS ์ฝ๋๋ฅผ ๋ ํจ๊ณผ์ ์ผ๋ก ๊ตฌ์ฑํ๊ณ ๊ด๋ฆฌํ๋ ๋ฐ ๋์์ ์ค ์ ์์ต๋๋ค.
- CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์ : ๋ง์ CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์คํ์ผ ์ฝ์
์์๋ฅผ ์ ์ดํ๊ธฐ ์ํ ์ค์ ์ต์
์ ์ ๊ณตํฉ๋๋ค. ์ ํํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฌธ์๋ฅผ ํ์ํ์ฌ ์ฝ์
์์๋ฅผ ๊ด๋ฆฌํ๋ ๋ด์ฅ ๋ฉ์ปค๋์ฆ์ด ์๋์ง ํ์ธํ์ญ์์ค. ์๋ฅผ ๋ค์ด, Styled Components์๋ `
` ์ปดํฌ๋ํธ๊ฐ ์์ต๋๋ค.
๋ชจ๋ฒ ์ฌ๋ก ๋ฐ ๊ถ์ฅ ์ฌํญ
- ์ฃผ์ํด์ ์ฌ์ฉ:
experimental_useInsertionEffect๋ ์์ง ์คํ์ ์ด๋ผ๋ ์ ์ ๊ธฐ์ตํ์ญ์์ค. ์ ์คํ๊ฒ ์ฌ์ฉํ๊ณ ํ ์ด ๋ฐ์ ํจ์ ๋ฐ๋ผ ์ฝ๋๋ฅผ ์์ ํ ์ค๋น๋ฅผ ํ์ญ์์ค. - ์ฑ๋ฅ ์ฐ์ : ์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ์ ์ผ๋์ ๋๊ณ ์คํ์ผ ์ ๋ฐ์ดํธ๋ฅผ ์ต์ํํ๋๋ก ์ฝ๋๋ฅผ ์ต์ ํํ์ญ์์ค.
- ๋์ ๊ณ ๋ ค:
experimental_useInsertionEffect์ ์์กดํ๊ธฐ ์ ์ CSS ๋ชจ๋์ด๋ CSS ๋ณ์์ ๊ฐ์ ๋์์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ํ์ํ์ญ์์ค. - ์ฝ๋ ๋ฌธ์ํ:
experimental_useInsertionEffect๋ฅผ ์ฌ์ฉํ๋ ์ด์ ์ ์ฝ์ ์์์ ๊ด๋ จ๋ ํน์ ๊ณ ๋ ค ์ฌํญ์ ๋ช ํํ๊ฒ ๋ฌธ์ํํ์ญ์์ค. - ์ฒ ์ ํ ํ ์คํธ: ์คํ์ผ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ฉ๋๊ณ ์์์น ๋ชปํ ์๊ฐ์ ๊ฒฐํจ์ด ์๋์ง ํ์ธํ๊ธฐ ์ํด ์ฝ๋๋ฅผ ์ฒ ์ ํ ํ ์คํธํ์ญ์์ค.
- ์ต์ ์ ๋ณด ์ ์ง:
experimental_useInsertionEffect์ ๋ณ๊ฒฝ ์ฌํญ์ด๋ ๊ฐ์ ์ฌํญ์ ๋ํด ์์๋ณด๊ธฐ ์ํด ์ต์ React ๋ฆด๋ฆฌ์ค ๋ฐ ๋ฌธ์๋ฅผ ๊ณ์ ํ์ธํ์ญ์์ค. - ์คํ์ผ ๊ฒฉ๋ฆฌ ๋ฐ ๋ฒ์ ์ง์ : ์ ์ญ ์คํ์ผ ์ถฉ๋์ ๋ฐฉ์งํ๊ณ ๋ช ์์ ์ธ ์์ ์ ์ด์ ํ์์ฑ์ ์ค์ด๊ธฐ ์ํด CSS ๋ชจ๋์ด๋ BEM ๋ช ๋ช ๊ท์น๊ณผ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ญ์์ค.
๊ฒฐ๋ก
experimental_useInsertionEffect๋ React ์ ํ๋ฆฌ์ผ์ด์
์์ CSS ์ฝ์
์์๋ฅผ ์ ์ดํ๋ ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. ์์ง ์คํ ๋จ๊ณ์ด์ง๋ง, ํนํ CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ณต์กํ ํ
๋ง ์๊ตฌ์ฌํญ์ ๋ค๋ฃฐ ๋ ์คํ์ผ๋ง ์ถฉ๋์ ํด๊ฒฐํ๊ณ ์ฑ๋ฅ์ ์ต์ ํํ๋ ๋ฐ ์ ์ฉํ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ฝ์
์์์ ๋ฏธ๋ฌํ ์ฐจ์ด๋ฅผ ์ดํดํ๊ณ ์ด ๊ฐ์ด๋์์ ์ค๋ช
ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ ์ฉํจ์ผ๋ก์จ, experimental_useInsertionEffect๋ฅผ ํ์ฉํ์ฌ ๋ ๊ฒฌ๊ณ ํ๊ณ ์ ์ง๋ณด์ ๊ฐ๋ฅํ๋ฉฐ ์ฑ๋ฅ์ด ๋ฐ์ด๋ React ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ์ ๋ต์ ์ผ๋ก ์ฌ์ฉํ๊ณ , ์ ์ ํ ๋ ๋์์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ๊ณ ๋ คํ๋ฉฐ, ์ด ์คํ์ ์ธ ํ
์ ๋ฐ์ ์ ๋ํ ์ ๋ณด๋ฅผ ๊ณ์ ์ฃผ์ํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค. React๊ฐ ๊ณ์ ๋ฐ์ ํจ์ ๋ฐ๋ผ, experimental_useInsertionEffect์ ๊ฐ์ ๊ธฐ๋ฅ๋ค์ ๊ฐ๋ฐ์๋ค์ด ์ ์ ๋ ์ ๊ตํ๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค ์ ์๋๋ก ํ์ ์ค์ด์ค ๊ฒ์
๋๋ค.